//
//  MinSubArrayLen.swift
//  LeetCodeSummary
//
//  Created by WangYonghe on 2020/6/29.
//  Copyright © 2020 WangYonghe. All rights reserved.
//  209. 长度最小的子数组   tag:Sliding Window

import UIKit

/*
 209. 长度最小的子数组
 给定一个含有 n 个正整数的数组和一个正整数 s ，找出该数组中满足其和 ≥ s 的长度最小的连续子数组，并返回其长度。如果不存在符合条件的连续子数组，返回 0。

  
 示例：

 输入：s = 7, nums = [2,3,1,2,4,3]
 输出：2
 解释：子数组 [4,3] 是该条件下的长度最小的连续子数组。
  

 进阶：

 如果你已经完成了 O(n) 时间复杂度的解法, 请尝试 O(n log n) 时间复杂度的解法。
 */

class MinSubArrayLen: NSObject {
    
    //记录满足调教的子串
    var sum7ArrRes:[String] = []
    
    func minSubArrayLen(_ s: Int, _ nums: [Int]) -> Int {
        //双指针法
        var point1 = 0
        var point2 = 0
        
        //记录子串长度
        var subArrlenth = nums.count + 1
        //当前子串的和
        var subArrSum = 0
        
        //[2,3,1,2,4,3]
        
        //指针1向后遍历  指针2原地不动
        for index in 0 ..< nums.count{
            subArrSum = subArrSum + nums[index]
            print("第\(index)次外循环，此时sumSubArr=\(subArrSum)")
            if subArrSum >= s {
                print("第\(index)次外循环后子串和>=7")
                //满足条件 记录指针1的位置
                point1 = index

                //然后指针2开始后移
                while subArrSum >= s {
                    print("第\(index)次外循环后中出现内循环")
                    sum7ArrRes.append("start:\(point2)---end:\(point1)")
                    if point1 - point2 + 1 < subArrlenth {
                        subArrlenth = point1 - point2 + 1
                    }
                    point2 = point2 + 1
           
                    subArrSum = subArrSum - nums[point2-1]
                }
            }
            print("point1：\(point1)---point2：\(point2)")
        }
        
        print("满足调教的子串有\(sum7ArrRes)")
        if subArrlenth == nums.count + 1 {
            subArrlenth = 0
        }
        
        return subArrlenth
    }
    
}
